home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Chat & Communication / Digsby build 37 / digsby_setup.exe / lib / rfc822.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-13  |  20KB  |  898 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. import time
  5. __all__ = [
  6.     'Message',
  7.     'AddressList',
  8.     'parsedate',
  9.     'parsedate_tz',
  10.     'mktime_tz']
  11. _blanklines = ('\r\n', '\n')
  12.  
  13. class Message:
  14.     
  15.     def __init__(self, fp, seekable = 1):
  16.         if seekable == 1:
  17.             
  18.             try:
  19.                 fp.tell()
  20.             except (AttributeError, IOError):
  21.                 seekable = 0
  22.             except:
  23.                 None<EXCEPTION MATCH>(AttributeError, IOError)
  24.             
  25.  
  26.         None<EXCEPTION MATCH>(AttributeError, IOError)
  27.         self.fp = fp
  28.         self.seekable = seekable
  29.         self.startofheaders = None
  30.         self.startofbody = None
  31.         if self.seekable:
  32.             
  33.             try:
  34.                 self.startofheaders = self.fp.tell()
  35.             except IOError:
  36.                 self.seekable = 0
  37.             except:
  38.                 None<EXCEPTION MATCH>IOError
  39.             
  40.  
  41.         None<EXCEPTION MATCH>IOError
  42.         self.readheaders()
  43.         if self.seekable:
  44.             
  45.             try:
  46.                 self.startofbody = self.fp.tell()
  47.             except IOError:
  48.                 self.seekable = 0
  49.             except:
  50.                 None<EXCEPTION MATCH>IOError
  51.             
  52.  
  53.         None<EXCEPTION MATCH>IOError
  54.  
  55.     
  56.     def rewindbody(self):
  57.         if not self.seekable:
  58.             raise IOError, 'unseekable file'
  59.         
  60.         self.fp.seek(self.startofbody)
  61.  
  62.     
  63.     def readheaders(self):
  64.         self.dict = { }
  65.         self.unixfrom = ''
  66.         self.headers = lst = []
  67.         self.status = ''
  68.         headerseen = ''
  69.         firstline = 1
  70.         startofline = None
  71.         unread = None
  72.         tell = None
  73.         if hasattr(self.fp, 'unread'):
  74.             unread = self.fp.unread
  75.         elif self.seekable:
  76.             tell = self.fp.tell
  77.         
  78.         while tell:
  79.             
  80.             try:
  81.                 startofline = tell()
  82.             except IOError:
  83.                 startofline = None
  84.                 tell = None
  85.                 self.seekable = 0
  86.             except:
  87.                 None<EXCEPTION MATCH>IOError
  88.             
  89.  
  90.             None<EXCEPTION MATCH>IOError
  91.             line = self.fp.readline()
  92.             if not line:
  93.                 self.status = 'EOF in headers'
  94.                 break
  95.             
  96.         if firstline and line.startswith('From '):
  97.             self.unixfrom = self.unixfrom + line
  98.             continue
  99.         
  100.         firstline = 0
  101.         if headerseen and line[0] in ' \t':
  102.             lst.append(line)
  103.             x = self.dict[headerseen] + '\n ' + line.strip()
  104.             self.dict[headerseen] = x.strip()
  105.             continue
  106.         elif self.iscomment(line):
  107.             continue
  108.         elif self.islast(line):
  109.             break
  110.         
  111.         headerseen = self.isheader(line)
  112.         if headerseen:
  113.             lst.append(line)
  114.             self.dict[headerseen] = line[len(headerseen) + 1:].strip()
  115.             continue
  116.             continue
  117.         if not self.dict:
  118.             self.status = 'No headers'
  119.         else:
  120.             self.status = 'Non-header line where header expected'
  121.         if unread:
  122.             unread(line)
  123.         elif tell:
  124.             self.fp.seek(startofline)
  125.         else:
  126.             self.status = self.status + '; bad seek'
  127.         break
  128.         continue
  129.  
  130.     
  131.     def isheader(self, line):
  132.         i = line.find(':')
  133.         if i > 0:
  134.             return line[:i].lower()
  135.         
  136.  
  137.     
  138.     def islast(self, line):
  139.         return line in _blanklines
  140.  
  141.     
  142.     def iscomment(self, line):
  143.         return False
  144.  
  145.     
  146.     def getallmatchingheaders(self, name):
  147.         name = name.lower() + ':'
  148.         n = len(name)
  149.         lst = []
  150.         hit = 0
  151.         for line in self.headers:
  152.             if line[:n].lower() == name:
  153.                 hit = 1
  154.             elif not line[:1].isspace():
  155.                 hit = 0
  156.             
  157.             if hit:
  158.                 lst.append(line)
  159.                 continue
  160.         
  161.         return lst
  162.  
  163.     
  164.     def getfirstmatchingheader(self, name):
  165.         name = name.lower() + ':'
  166.         n = len(name)
  167.         lst = []
  168.         hit = 0
  169.         for line in self.headers:
  170.             if hit:
  171.                 if not line[:1].isspace():
  172.                     break
  173.                 
  174.             elif line[:n].lower() == name:
  175.                 hit = 1
  176.             
  177.             if hit:
  178.                 lst.append(line)
  179.                 continue
  180.         
  181.         return lst
  182.  
  183.     
  184.     def getrawheader(self, name):
  185.         lst = self.getfirstmatchingheader(name)
  186.         if not lst:
  187.             return None
  188.         
  189.         lst[0] = lst[0][len(name) + 1:]
  190.         return ''.join(lst)
  191.  
  192.     
  193.     def getheader(self, name, default = None):
  194.         return self.dict.get(name.lower(), default)
  195.  
  196.     get = getheader
  197.     
  198.     def getheaders(self, name):
  199.         result = []
  200.         current = ''
  201.         have_header = 0
  202.         for s in self.getallmatchingheaders(name):
  203.             if s[0].isspace():
  204.                 if current:
  205.                     current = '%s\n %s' % (current, s.strip())
  206.                 else:
  207.                     current = s.strip()
  208.             current
  209.             if have_header:
  210.                 result.append(current)
  211.             
  212.             current = s[s.find(':') + 1:].strip()
  213.             have_header = 1
  214.         
  215.         if have_header:
  216.             result.append(current)
  217.         
  218.         return result
  219.  
  220.     
  221.     def getaddr(self, name):
  222.         alist = self.getaddrlist(name)
  223.         if alist:
  224.             return alist[0]
  225.         else:
  226.             return (None, None)
  227.  
  228.     
  229.     def getaddrlist(self, name):
  230.         raw = []
  231.         for h in self.getallmatchingheaders(name):
  232.             if h[0] in ' \t':
  233.                 raw.append(h)
  234.                 continue
  235.             if raw:
  236.                 raw.append(', ')
  237.             
  238.             i = h.find(':')
  239.             if i > 0:
  240.                 addr = h[i + 1:]
  241.             
  242.             raw.append(addr)
  243.         
  244.         alladdrs = ''.join(raw)
  245.         a = AddressList(alladdrs)
  246.         return a.addresslist
  247.  
  248.     
  249.     def getdate(self, name):
  250.         
  251.         try:
  252.             data = self[name]
  253.         except KeyError:
  254.             return None
  255.  
  256.         return parsedate(data)
  257.  
  258.     
  259.     def getdate_tz(self, name):
  260.         
  261.         try:
  262.             data = self[name]
  263.         except KeyError:
  264.             return None
  265.  
  266.         return parsedate_tz(data)
  267.  
  268.     
  269.     def __len__(self):
  270.         return len(self.dict)
  271.  
  272.     
  273.     def __getitem__(self, name):
  274.         return self.dict[name.lower()]
  275.  
  276.     
  277.     def __setitem__(self, name, value):
  278.         del self[name]
  279.         self.dict[name.lower()] = value
  280.         text = name + ': ' + value
  281.         for line in text.split('\n'):
  282.             self.headers.append(line + '\n')
  283.         
  284.  
  285.     
  286.     def __delitem__(self, name):
  287.         name = name.lower()
  288.         if name not in self.dict:
  289.             return None
  290.         
  291.         del self.dict[name]
  292.         name = name + ':'
  293.         n = len(name)
  294.         lst = []
  295.         hit = 0
  296.         for i in range(len(self.headers)):
  297.             line = self.headers[i]
  298.             if line[:n].lower() == name:
  299.                 hit = 1
  300.             elif not line[:1].isspace():
  301.                 hit = 0
  302.             
  303.             if hit:
  304.                 lst.append(i)
  305.                 continue
  306.         
  307.         for i in reversed(lst):
  308.             del self.headers[i]
  309.         
  310.  
  311.     
  312.     def setdefault(self, name, default = ''):
  313.         lowername = name.lower()
  314.         if lowername in self.dict:
  315.             return self.dict[lowername]
  316.         else:
  317.             text = name + ': ' + default
  318.             for line in text.split('\n'):
  319.                 self.headers.append(line + '\n')
  320.             
  321.             self.dict[lowername] = default
  322.             return default
  323.  
  324.     
  325.     def has_key(self, name):
  326.         return name.lower() in self.dict
  327.  
  328.     
  329.     def __contains__(self, name):
  330.         return name.lower() in self.dict
  331.  
  332.     
  333.     def __iter__(self):
  334.         return iter(self.dict)
  335.  
  336.     
  337.     def keys(self):
  338.         return self.dict.keys()
  339.  
  340.     
  341.     def values(self):
  342.         return self.dict.values()
  343.  
  344.     
  345.     def items(self):
  346.         return self.dict.items()
  347.  
  348.     
  349.     def __str__(self):
  350.         return ''.join(self.headers)
  351.  
  352.  
  353.  
  354. def unquote(s):
  355.     if len(s) > 1:
  356.         if s.startswith('"') and s.endswith('"'):
  357.             return s[1:-1].replace('\\\\', '\\').replace('\\"', '"')
  358.         
  359.         if s.startswith('<') and s.endswith('>'):
  360.             return s[1:-1]
  361.         
  362.     
  363.     return s
  364.  
  365.  
  366. def quote(s):
  367.     return s.replace('\\', '\\\\').replace('"', '\\"')
  368.  
  369.  
  370. def parseaddr(address):
  371.     a = AddressList(address)
  372.     lst = a.addresslist
  373.     if not lst:
  374.         return (None, None)
  375.     
  376.     return lst[0]
  377.  
  378.  
  379. class AddrlistClass:
  380.     
  381.     def __init__(self, field):
  382.         self.specials = '()<>@,:;."[]'
  383.         self.pos = 0
  384.         self.LWS = ' \t'
  385.         self.CR = '\r\n'
  386.         self.atomends = self.specials + self.LWS + self.CR
  387.         self.phraseends = self.atomends.replace('.', '')
  388.         self.field = field
  389.         self.commentlist = []
  390.  
  391.     
  392.     def gotonext(self):
  393.         while self.pos < len(self.field):
  394.             if self.field[self.pos] in self.LWS + '\n\r':
  395.                 self.pos = self.pos + 1
  396.                 continue
  397.             if self.field[self.pos] == '(':
  398.                 self.commentlist.append(self.getcomment())
  399.                 continue
  400.             break
  401.  
  402.     
  403.     def getaddrlist(self):
  404.         result = []
  405.         ad = self.getaddress()
  406.         while ad:
  407.             result += ad
  408.             ad = self.getaddress()
  409.         return result
  410.  
  411.     
  412.     def getaddress(self):
  413.         self.commentlist = []
  414.         self.gotonext()
  415.         oldpos = self.pos
  416.         oldcl = self.commentlist
  417.         plist = self.getphraselist()
  418.         self.gotonext()
  419.         returnlist = []
  420.         if self.pos >= len(self.field):
  421.             if plist:
  422.                 returnlist = [
  423.                     (' '.join(self.commentlist), plist[0])]
  424.             
  425.         elif self.field[self.pos] in '.@':
  426.             self.pos = oldpos
  427.             self.commentlist = oldcl
  428.             addrspec = self.getaddrspec()
  429.             returnlist = [
  430.                 (' '.join(self.commentlist), addrspec)]
  431.         elif self.field[self.pos] == ':':
  432.             returnlist = []
  433.             fieldlen = len(self.field)
  434.             self.pos += 1
  435.             while self.pos < len(self.field):
  436.                 self.gotonext()
  437.                 returnlist = returnlist + self.getaddress()
  438.                 continue
  439.                 None if self.pos < fieldlen and self.field[self.pos] == ';' else self
  440.         elif self.field[self.pos] == '<':
  441.             routeaddr = self.getrouteaddr()
  442.             if self.commentlist:
  443.                 returnlist = [
  444.                     (' '.join(plist) + ' (' + ' '.join(self.commentlist) + ')', routeaddr)]
  445.             else:
  446.                 returnlist = [
  447.                     (' '.join(plist), routeaddr)]
  448.         elif plist:
  449.             returnlist = [
  450.                 (' '.join(self.commentlist), plist[0])]
  451.         elif self.field[self.pos] in self.specials:
  452.             self.pos += 1
  453.         
  454.         self.gotonext()
  455.         if self.pos < len(self.field) and self.field[self.pos] == ',':
  456.             self.pos += 1
  457.         
  458.         return returnlist
  459.  
  460.     
  461.     def getrouteaddr(self):
  462.         if self.field[self.pos] != '<':
  463.             return None
  464.         
  465.         expectroute = 0
  466.         self.pos += 1
  467.         self.gotonext()
  468.         adlist = ''
  469.         while self.pos < len(self.field):
  470.             if expectroute:
  471.                 self.getdomain()
  472.                 expectroute = 0
  473.             elif self.field[self.pos] == '>':
  474.                 self.pos += 1
  475.                 break
  476.             elif self.field[self.pos] == '@':
  477.                 self.pos += 1
  478.                 expectroute = 1
  479.             elif self.field[self.pos] == ':':
  480.                 self.pos += 1
  481.             else:
  482.                 adlist = self.getaddrspec()
  483.                 self.pos += 1
  484.                 break
  485.             self.gotonext()
  486.             continue
  487.             self
  488.         return adlist
  489.  
  490.     
  491.     def getaddrspec(self):
  492.         aslist = []
  493.         self.gotonext()
  494.         while self.pos < len(self.field):
  495.             if self.field[self.pos] == '.':
  496.                 aslist.append('.')
  497.                 self.pos += 1
  498.             elif self.field[self.pos] == '"':
  499.                 aslist.append('"%s"' % self.getquote())
  500.             elif self.field[self.pos] in self.atomends:
  501.                 break
  502.             else:
  503.                 aslist.append(self.getatom())
  504.             self.gotonext()
  505.         if self.pos >= len(self.field) or self.field[self.pos] != '@':
  506.             return ''.join(aslist)
  507.         
  508.         aslist.append('@')
  509.         self.pos += 1
  510.         self.gotonext()
  511.         return ''.join(aslist) + self.getdomain()
  512.  
  513.     
  514.     def getdomain(self):
  515.         sdlist = []
  516.         while self.pos < len(self.field):
  517.             if self.field[self.pos] in self.LWS:
  518.                 self.pos += 1
  519.                 continue
  520.             self
  521.             if self.field[self.pos] == '(':
  522.                 self.commentlist.append(self.getcomment())
  523.                 continue
  524.             None if self.field[self.pos] == '[' else self
  525.             if self.field[self.pos] in self.atomends:
  526.                 break
  527.                 continue
  528.             sdlist.append(self.getatom())
  529.         return ''.join(sdlist)
  530.  
  531.     
  532.     def getdelimited(self, beginchar, endchars, allowcomments = 1):
  533.         if self.field[self.pos] != beginchar:
  534.             return ''
  535.         
  536.         slist = [
  537.             '']
  538.         quote = 0
  539.         self.pos += 1
  540.         while self.pos < len(self.field):
  541.             if quote == 1:
  542.                 slist.append(self.field[self.pos])
  543.                 quote = 0
  544.             elif self.field[self.pos] in endchars:
  545.                 self.pos += 1
  546.                 break
  547.             elif allowcomments and self.field[self.pos] == '(':
  548.                 slist.append(self.getcomment())
  549.                 continue
  550.             elif self.field[self.pos] == '\\':
  551.                 quote = 1
  552.             else:
  553.                 slist.append(self.field[self.pos])
  554.             self.pos += 1
  555.             continue
  556.             self
  557.         return ''.join(slist)
  558.  
  559.     
  560.     def getquote(self):
  561.         return self.getdelimited('"', '"\r', 0)
  562.  
  563.     
  564.     def getcomment(self):
  565.         return self.getdelimited('(', ')\r', 1)
  566.  
  567.     
  568.     def getdomainliteral(self):
  569.         return '[%s]' % self.getdelimited('[', ']\r', 0)
  570.  
  571.     
  572.     def getatom(self, atomends = None):
  573.         atomlist = [
  574.             '']
  575.         if atomends is None:
  576.             atomends = self.atomends
  577.         
  578.         while self.pos < len(self.field):
  579.             if self.field[self.pos] in atomends:
  580.                 break
  581.             else:
  582.                 atomlist.append(self.field[self.pos])
  583.             self.pos += 1
  584.             continue
  585.             self
  586.         return ''.join(atomlist)
  587.  
  588.     
  589.     def getphraselist(self):
  590.         plist = []
  591.         while self.pos < len(self.field):
  592.             if self.field[self.pos] in self.LWS:
  593.                 self.pos += 1
  594.                 continue
  595.             self
  596.             if self.field[self.pos] == '"':
  597.                 plist.append(self.getquote())
  598.                 continue
  599.             if self.field[self.pos] == '(':
  600.                 self.commentlist.append(self.getcomment())
  601.                 continue
  602.             if self.field[self.pos] in self.phraseends:
  603.                 break
  604.                 continue
  605.             plist.append(self.getatom(self.phraseends))
  606.         return plist
  607.  
  608.  
  609.  
  610. class AddressList(AddrlistClass):
  611.     
  612.     def __init__(self, field):
  613.         AddrlistClass.__init__(self, field)
  614.         if field:
  615.             self.addresslist = self.getaddrlist()
  616.         else:
  617.             self.addresslist = []
  618.  
  619.     
  620.     def __len__(self):
  621.         return len(self.addresslist)
  622.  
  623.     
  624.     def __str__(self):
  625.         return ', '.join(map(dump_address_pair, self.addresslist))
  626.  
  627.     
  628.     def __add__(self, other):
  629.         newaddr = AddressList(None)
  630.         newaddr.addresslist = self.addresslist[:]
  631.         for x in other.addresslist:
  632.             if x not in self.addresslist:
  633.                 newaddr.addresslist.append(x)
  634.                 continue
  635.         
  636.         return newaddr
  637.  
  638.     
  639.     def __iadd__(self, other):
  640.         for x in other.addresslist:
  641.             if x not in self.addresslist:
  642.                 self.addresslist.append(x)
  643.                 continue
  644.         
  645.         return self
  646.  
  647.     
  648.     def __sub__(self, other):
  649.         newaddr = AddressList(None)
  650.         for x in self.addresslist:
  651.             if x not in other.addresslist:
  652.                 newaddr.addresslist.append(x)
  653.                 continue
  654.         
  655.         return newaddr
  656.  
  657.     
  658.     def __isub__(self, other):
  659.         for x in other.addresslist:
  660.             if x in self.addresslist:
  661.                 self.addresslist.remove(x)
  662.                 continue
  663.         
  664.         return self
  665.  
  666.     
  667.     def __getitem__(self, index):
  668.         return self.addresslist[index]
  669.  
  670.  
  671.  
  672. def dump_address_pair(pair):
  673.     if pair[0]:
  674.         return '"' + pair[0] + '" <' + pair[1] + '>'
  675.     else:
  676.         return pair[1]
  677.  
  678. _monthnames = [
  679.     'jan',
  680.     'feb',
  681.     'mar',
  682.     'apr',
  683.     'may',
  684.     'jun',
  685.     'jul',
  686.     'aug',
  687.     'sep',
  688.     'oct',
  689.     'nov',
  690.     'dec',
  691.     'january',
  692.     'february',
  693.     'march',
  694.     'april',
  695.     'may',
  696.     'june',
  697.     'july',
  698.     'august',
  699.     'september',
  700.     'october',
  701.     'november',
  702.     'december']
  703. _daynames = [
  704.     'mon',
  705.     'tue',
  706.     'wed',
  707.     'thu',
  708.     'fri',
  709.     'sat',
  710.     'sun']
  711. _timezones = {
  712.     'UT': 0,
  713.     'UTC': 0,
  714.     'GMT': 0,
  715.     'Z': 0,
  716.     'AST': -400,
  717.     'ADT': -300,
  718.     'EST': -500,
  719.     'EDT': -400,
  720.     'CST': -600,
  721.     'CDT': -500,
  722.     'MST': -700,
  723.     'MDT': -600,
  724.     'PST': -800,
  725.     'PDT': -700 }
  726.  
  727. def parsedate_tz(data):
  728.     if not data:
  729.         return None
  730.     
  731.     data = data.split()
  732.     if data[0][-1] in (',', '.') or data[0].lower() in _daynames:
  733.         del data[0]
  734.     else:
  735.         i = data[0].rfind(',')
  736.         if i >= 0:
  737.             data[0] = data[0][i + 1:]
  738.         
  739.     if len(data) == 3:
  740.         stuff = data[0].split('-')
  741.         if len(stuff) == 3:
  742.             data = stuff + data[1:]
  743.         
  744.     
  745.     if len(data) == 4:
  746.         s = data[3]
  747.         i = s.find('+')
  748.         if i > 0:
  749.             data[3:] = [
  750.                 s[:i],
  751.                 s[i + 1:]]
  752.         else:
  753.             data.append('')
  754.     
  755.     if len(data) < 5:
  756.         return None
  757.     
  758.     data = data[:5]
  759.     (dd, mm, yy, tm, tz) = data
  760.     mm = mm.lower()
  761.     if mm not in _monthnames:
  762.         dd = mm
  763.         mm = dd.lower()
  764.         if mm not in _monthnames:
  765.             return None
  766.         
  767.     
  768.     mm = _monthnames.index(mm) + 1
  769.     if mm > 12:
  770.         mm = mm - 12
  771.     
  772.     if dd[-1] == ',':
  773.         dd = dd[:-1]
  774.     
  775.     i = yy.find(':')
  776.     if i > 0:
  777.         yy = tm
  778.         tm = yy
  779.     
  780.     if yy[-1] == ',':
  781.         yy = yy[:-1]
  782.     
  783.     if not yy[0].isdigit():
  784.         yy = tz
  785.         tz = yy
  786.     
  787.     if tm[-1] == ',':
  788.         tm = tm[:-1]
  789.     
  790.     tm = tm.split(':')
  791.     if len(tm) == 2:
  792.         (thh, tmm) = tm
  793.         tss = '0'
  794.     elif len(tm) == 3:
  795.         (thh, tmm, tss) = tm
  796.     else:
  797.         return None
  798.     
  799.     try:
  800.         yy = int(yy)
  801.         dd = int(dd)
  802.         thh = int(thh)
  803.         tmm = int(tmm)
  804.         tss = int(tss)
  805.     except ValueError:
  806.         return None
  807.  
  808.     tzoffset = None
  809.     tz = tz.upper()
  810.     if tz in _timezones:
  811.         tzoffset = _timezones[tz]
  812.     else:
  813.         
  814.         try:
  815.             tzoffset = int(tz)
  816.         except ValueError:
  817.             pass
  818.  
  819.     if tzoffset:
  820.         if tzoffset < 0:
  821.             tzsign = -1
  822.             tzoffset = -tzoffset
  823.         else:
  824.             tzsign = 1
  825.         tzoffset = tzsign * ((tzoffset // 100) * 3600 + (tzoffset % 100) * 60)
  826.     
  827.     return (yy, mm, dd, thh, tmm, tss, 0, 1, 0, tzoffset)
  828.  
  829.  
  830. def parsedate(data):
  831.     t = parsedate_tz(data)
  832.     if t is None:
  833.         return t
  834.     
  835.     return t[:9]
  836.  
  837.  
  838. def mktime_tz(data):
  839.     if data[9] is None:
  840.         return time.mktime(data[:8] + (-1,))
  841.     else:
  842.         t = time.mktime(data[:8] + (0,))
  843.         return t - data[9] - time.timezone
  844.  
  845.  
  846. def formatdate(timeval = None):
  847.     if timeval is None:
  848.         timeval = time.time()
  849.     
  850.     timeval = time.gmtime(timeval)
  851.     return '%s, %02d %s %04d %02d:%02d:%02d GMT' % (('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun')[timeval[6]], timeval[2], ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec')[timeval[1] - 1], timeval[0], timeval[3], timeval[4], timeval[5])
  852.  
  853. if __name__ == '__main__':
  854.     import sys
  855.     import os
  856.     file = os.path.join(os.environ['HOME'], 'Mail/inbox/1')
  857.     if sys.argv[1:]:
  858.         file = sys.argv[1]
  859.     
  860.     f = open(file, 'r')
  861.     m = Message(f)
  862.     print 'From:', m.getaddr('from')
  863.     print 'To:', m.getaddrlist('to')
  864.     print 'Subject:', m.getheader('subject')
  865.     print 'Date:', m.getheader('date')
  866.     date = m.getdate_tz('date')
  867.     tz = date[-1]
  868.     date = time.localtime(mktime_tz(date))
  869.     if date:
  870.         print 'ParsedDate:', time.asctime(date),
  871.         hhmmss = tz
  872.         (hhmm, ss) = divmod(hhmmss, 60)
  873.         (hh, mm) = divmod(hhmm, 60)
  874.         print '%+03d%02d' % (hh, mm),
  875.         if ss:
  876.             print '.%02d' % ss,
  877.         
  878.         print 
  879.     else:
  880.         print 'ParsedDate:', None
  881.     m.rewindbody()
  882.     n = 0
  883.     while f.readline():
  884.         n += 1
  885.     print 'Lines:', n
  886.     print '-' * 70
  887.     print 'len =', len(m)
  888.     if 'Date' in m:
  889.         print 'Date =', m['Date']
  890.     
  891.     if 'X-Nonsense' in m:
  892.         pass
  893.     
  894.     print 'keys =', m.keys()
  895.     print 'values =', m.values()
  896.     print 'items =', m.items()
  897.  
  898.